//package com.sunye.rocketmq;
//
//import com.google.gson.Gson;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
//import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
//import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
//import org.springframework.messaging.Message;
//import org.springframework.messaging.MessageHeaders;
//
//import java.nio.charset.StandardCharsets;
//
///***
// * 除了消费者之外，我们还需要创建事务消息生产者端的消息监听器，注意是生产者，
// * 不是消费者，我们需要实现的是RocketMQLocalTransactionListener接口。
// * 重写执行本地事务的方法和检查本地事务方法
// *
// */
//@Slf4j
//@RocketMQTransactionListener
//public class OrderTXMsgListener implements RocketMQLocalTransactionListener {
//
//
//    private static final Gson GSON = new Gson();
//
//    /***
//     * executeLocalTransaction方法是用来执行本地事务的，
//     * 将本地事务执行的状态告知Broker服务器的，并不能用来传消息，
//     * 如果想传数据库的主键id，可以提前生成主键id，而不要数据库自动生成。
//     * @param msg
//     * @param arg
//     * @return
//     */
//    @Override
//    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
//
//        log.info(">>>> TX message listener execute local transaction, message={},args={} <<<<",msg,arg);
//        log.error("---------------------------------------------------");
//        MessageHeaders headers = msg.getHeaders();
//        String rocketmq_TOPIC = (String) headers.get("rocketmq_TOPIC");
//        String rocketmq_tags = (String)headers.get("rocketmq_TAGS");
//        System.out.println("rocketmq_TOPIC = " + rocketmq_TOPIC);
//        System.out.println("rocketmq_tags = " + rocketmq_tags);
//        // 执行本地事务
//        RocketMQLocalTransactionState result = RocketMQLocalTransactionState.COMMIT;
//        try {
//            String jsonString = new String((byte[]) msg.getPayload(), StandardCharsets.UTF_8);
//            OrderEntity orderEntity = GSON.fromJson(jsonString, OrderEntity.class);
//            log.info(orderEntity.toString());
//            String id = (String) arg;
//            log.info(id);
//        } catch (Exception e) {
//            log.error(">>>> exception message={} <<<<",e.getMessage());
//            result = RocketMQLocalTransactionState.UNKNOWN;
//        }
//        return result;
//    }
//
//    /***
//     * checkLocalTransaction方
//     * 法是用来回查本地事务状态的
//     * @param msg
//     * @return
//     */
//    @Override
//    public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
//
//        log.info(">>>> TX message listener check local transaction, message={} <<<<",msg.getPayload());
//        // 检查本地事务
//        RocketMQLocalTransactionState result = RocketMQLocalTransactionState.COMMIT;
//        try {
//            String jsonString = new String((byte[]) msg.getPayload(), StandardCharsets.UTF_8);
//            OrderEntity orderEntity = GSON.fromJson(jsonString, OrderEntity.class);
//            log.info(orderEntity.toString());
//        } catch (Exception e) {
//            // 异常就回滚
//            log.error(">>>> exception message={} <<<<",e.getMessage());
//            result = RocketMQLocalTransactionState.ROLLBACK;
//        }
//        return result;
//    }
//}
//
//
